package cn.xzq.utils.servlet;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class BaseServlet extends HttpServlet{

	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		/*
		 * 对编码的处理
		 */
		if(req.getMethod().equalsIgnoreCase("post")) {
			req.setCharacterEncoding("UTF-8");
		} else if(req.getMethod().equalsIgnoreCase("get")){
			req = new GetRequest(req);
		}
		resp.setContentType("text/html;charset=utf-8");
		
		// 获取参数的中method值
		String methodName = req.getParameter("method");
		if(methodName == null || methodName.isEmpty()){
			throw new RuntimeException("没有method参数--很气愤！");
		}

		/*
		 * 得到方法名称，是否通过反射来调用
		 * 1、得到方法名，通过方法名再得到method类的对象
		 * 		需要得到class，然后调用它的方法进行查询，得到Method
		 * 		查询当前类的方法，
		 */
		Class c = this.getClass();
		Method method = null;
		try {
			method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
		} catch (Exception e) {
			throw new RuntimeException("调用的"+methodName+"方法不存在！");
		}
		
		/*
		 * 调用method表示的方法
		 */
		try {
			String result = (String) method.invoke(this, req,resp);
			/*
			 * 获取请求处理方法执行后放回的字符串，它表示转发或者重定向的路径
			 * 帮忙转发和重定向   f:/index.jsp  r:/index.jsp
			 */
			//判读返回的字符串是否为空，为空则无动作
			if(result == null || result.isEmpty()){
				return;
			}
			/*
			 * 查看返回字符串中是否包含冒号"："，如果没有，表示转发
			 * 如果有，使用冒号分割字符串，得到前后缀
			 * 其中前缀是f，表示转发，反之前缀是r，表示重定向
			 */
			if(result.contains(":")){
				//分割字符串，获取前后缀
				//f:/index.jsp -->  [1] "f"   [2]"/index.jsp"
				String[] split = result.split(":");
				//System.out.println(split[0] + "-------" + split[1]);
				switch (split[0]) {
				case "f":
					req.getRequestDispatcher(split[1]).forward(req, resp);
					break;
				case "r":
					resp.sendRedirect(req.getContextPath() + split[1]);
					break;
				default:
					throw new RuntimeException("您指定的操作：'" + split[0] + "'  当前版本不支持！");
				}

			}else{
				//没有冒号，默认表示转发
				req.getRequestDispatcher(result).forward(req, resp);				
			}
			
		} catch (Exception e) {
			System.out.println("调用的"+methodName+"方法内部抛出异常！");
			throw new RuntimeException(e);
		} 
	}

		
}
